// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// 对于不为

// go:build aix | | darwin | | |（js&&wasm）| | |（solaris&&illumos）

package poll

import (
	"syscall"
)

// accept系统调用的包装器，该调用将返回的文件
// 描述符标记为非阻塞，并在执行时关闭。
func accept(s int) (int, syscall.Sockaddr, string, error) {
	// 见/syscall/exec_unix。请查阅ForkLock的描述。
	// 可能可以在syscall中保持锁。接受
	// 因为我们已经把fd。sysfd进入非阻塞模式。
	// 但是，对File方法的调用将使其返回到
	// 阻塞模式。我们不能冒这个险，所以这里不用叉子锁。
	ns, sa, err := AcceptFunc(s)
	if err == nil {
		syscall.CloseOnExec(ns)
	}
	if err != nil {
		return -1, nil, "accept", err
	}
	if err = syscall.SetNonblock(ns, true); err != nil {
		CloseFunc(ns)
		return -1, nil, "setnonblock", err
	}
	return ns, sa, "", nil
}
